//
//  CZStatusDAL.swift
//  Weibo27
//
//  Created by apple on 16/4/28.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit

class CZStatusDAL: NSObject {
    
    
    /*
            - 查看我们本地是否有对应的缓存数据
                - 有 直接从本地取 然后在首页展示
                - 无 从网络获取数据  然后 在把我们请求到的数据保存到本地
    
    */
    
    // 获取微博首页数据方法
    class func getHomeStatus(since_id: Int64, max_id: Int64, callback:(array: [[String: AnyObject]])->()){
        
        // 01 判断本地是否有数据
        let result = checkoutCacheStatus(since_id, max_id: max_id)
        // 本地没有缓存该数据 需要从网络取
        
        if result.count == 0{
            CZNetworkTools.sharedTools.loadStatus(CZUserAccountTools.sharedTools.accessToken!, since_id: since_id, max_id: max_id, callback: { (response, error) -> () in
                if error != nil{
                    callback(array: [])
                    print(error)
                    return
                }
                // 判断我们的得到的数据是否存在 而且是否是一个数组
                guard let array = response?["statuses"] as? [[String: AnyObject]] else{
                    print("返回的数据不是一个数组")
                    callback(array: [])
                    return
                }
                print("网络数据")
                callback(array: array)
                // 代表请求数据成功 把请求回来的数据数据缓存到本地
                CZStatusDAL.saveStatus(array)
            })
            
            
            
        }else{
            // 本地有缓存数据 从本地取
            print("缓存数据")
            callback(array: result)
            
        }
        
        
    }
 
    // 查询本地微博数据
    class func checkoutCacheStatus(since_id: Int64, max_id: Int64) -> [[String: AnyObject]] {
        // 如果我们sinceid  和maxid 都为0  就认为是第一次加载数据 那么我就需要他在网络获取
        if since_id == 0 && max_id == 0{
            return []
        }
        
        // 获取用户的userI
        let userId = CZUserAccountTools.sharedTools.userAccount!.uid!
        
        var sql = "SELECT status FROM T_Status WHERE userId = \(userId) "
        // 下拉刷新
        if since_id > 0{
            sql += " AND statusId > \(since_id)"
            
        }
        // 上拉记载更多
        if max_id > 0{
            sql += " AND statusId < \(max_id)"
        }
        // 限制查询数据的条数
        sql += " ORDER BY statusId DESC LIMIT 20"
        
        // 定义一个临时数组
        var tempArray: [[String: AnyObject]] = [[String: AnyObject]]()
        
        
        SQLManager.sharedTools.queue.inDatabase { (db) -> Void in
            do{
                let res = try db.executeQuery(sql)
                while res.next(){
                    let status = res.dataForColumn("status")
                    let dic = try! NSJSONSerialization.JSONObjectWithData(status, options: []) as! [String: AnyObject]
                    
                    // 保存数组
                    tempArray.append(dic)
                }
            }catch{
                print(error)
            }
        }
       return tempArray
    }
    
    // 提供一个保存从网络加载回来的数据方法
    class func saveStatus(array: [[String: AnyObject]]) {
        // 获取用户的userId
        let userId = CZUserAccountTools.sharedTools.userAccount!.uid!
        // 由于我们可能已经保存过对应id 的微博数据  如果相同的话 我们需要替换掉
        let sql = "INSERT OR REPLACE INTO T_Status (statusId,status,userId) VALUES (?,?,?)"
        
        SQLManager.sharedTools.queue.inTransaction { (db, rollback) -> Void in
            for dic in array{

                do{
                    // 微博id
                    let statusId = dic["id"] as! NSNumber
                    // 微博数据
                    let status = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                    try db.executeUpdate(sql, statusId,status,userId)
               
                }catch{
                    print(error)
                    
                    rollback.memory = true
                }
            }
        }
        
    }

}
